#include <iostream>
#include <functional>
#include <list>

using namespace std;

void AjouterNavire()
{
    system("cls");
    int capVoyageur, nbCapitaine, nbSecond, nbMatelot, typeNav;
    float tonnage, capMarchandise;
    string nom,capVoyageurStr, nbCapitaineStr, nbSecondStr, nbMatelotStr, typeNavStr, tonnageStr, capMarchandiseStr;
    cin.ignore(numeric_limits<int>::max(), '\n');
    cout<<"  ###########################################################################"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ##                  Bienvenue dans le logiciel de gestion                ##"<<endl;
    cout<<"  ##                      de le compagnie maritime AM.LB                   ##"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ###########################################################################"<<endl;
    cout<<"  #                                                                         #"<<endl;
    cout<<"  #                        AJOUT D'UN NAVIRE                                #"<<endl;
    cout<<"  #                                                                         #"<<endl;
    cout<<"  #              Numero : "<<nbNavires+1<<endl;
    cout<<"  #                 Nom : ";getline(cin, nom);
    cout<<"  #  Type [1:FRET,2:MX] : ";getline(cin, typeNavStr);
    cout<<"  #             Tonnage : ";getline(cin, tonnageStr);
    cout<<"  #  Capacite Voyageurs : ";getline(cin, capVoyageurStr);
    cout<<"  #  Capacite Marchand. : ";getline(cin, capMarchandiseStr);
    cout<<"  #       Nb Capitaines : ";getline(cin, nbCapitaineStr);
    cout<<"  #          Nb Seconds : ";getline(cin, nbSecondStr);
    cout<<"  #         Nb Matelots : ";getline(cin, nbMatelotStr);
    cout<<"  #"<<endl;
    cout<<"  #  CREATION DU NAVIRE..."<<endl;

    typeNav = atoi(typeNavStr.c_str());
    tonnage = atof(tonnageStr.c_str());
    capVoyageur = atoi(capVoyageurStr.c_str());
    capMarchandise = atof(capMarchandiseStr.c_str());
    nbCapitaine = atoi(nbCapitaineStr.c_str());
    nbSecond = atoi(nbSecondStr.c_str());
    nbMatelot = atoi(nbMatelotStr.c_str());

    Navire * nav = new Navire(nbNavires+1,tonnage,capVoyageur,capMarchandise,nbCapitaine,nbSecond,nbMatelot,nom,typeNav);
    nbNavires = nbNavires+1;

    listNavires.push_back(nav);
    //listCapitaines.sort();
}
void ModifierNavire()
{
    bool estListe = false;
    int idNavire, capVoyageur, nbCapitaine, nbSecond, nbMatelot, typeNav;
    float tonnage, capMarchandise;
    string nom,capVoyageurStr, nbCapitaineStr, nbSecondStr, nbMatelotStr, typeNavStr, tonnageStr, capMarchandiseStr;

    system("cls");
    cout<<"  ###########################################################################"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ##                  Bienvenue dans le logiciel de gestion                ##"<<endl;
    cout<<"  ##                      de le compagnie maritime AM.LB                   ##"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ###########################################################################"<<endl;
    cout<<"  #                                                                         #"<<endl;
    cout<<"  #                  MODIFICATION DES NAVIRES                               #"<<endl;
    cout<<"  #                                                                         #"<<endl;

    list<Navire*>::iterator it;
    for(it = listNavires.begin();it != listNavires.end();it++)
    {
        cout<<"  #  "<<(*it)->getId()<<" : "<<(*it)->getNom()<<endl;
    }
    cout<<"  #    Entrez le numero du navire a modifier : ";cin>>idNavire;
    for(it = listNavires.begin();it != listNavires.end();it++)
    {
        if((*it)->getId() == idNavire)
        {
            estListe = true;
            cin.ignore(numeric_limits<int>::max(), '\n');
            cout<<"  #  Modification de "<<(*it)->getNom()<<" ("<<(*it)->getId()<<")"<<endl;
            cout<<"  #"<<endl;
            cout<<"  #         Nouveau nom : ";getline(cin, nom);
            do
            {
                cout<<"  #  Type [1:FRET,2:MX] : ";getline(cin, typeNavStr);
                typeNav = atoi(typeNavStr.c_str());
            }
            while(typeNav!=1 && typeNav!=2);
            cout<<"  #     Nouveau tonnage : ";getline(cin, tonnageStr);
            if(typeNav!=1)
            {
                cout<<"  #  Capacite Voyageurs : ";getline(cin, capVoyageurStr);
            }
            cout<<"  #  Capacite Marchand. : ";getline(cin, capMarchandiseStr);
            cout<<"  #       Nb Capitaines : ";getline(cin, nbCapitaineStr);
            cout<<"  #          Nb Seconds : ";getline(cin, nbSecondStr);
            cout<<"  #         Nb Matelots : ";getline(cin, nbMatelotStr);

            tonnage = atof(tonnageStr.c_str());
            if(typeNav==1)
            {
                capVoyageur = 0;
            }
            else
            {
                capVoyageur = atoi(capVoyageurStr.c_str());
            }

            capMarchandise = atof(capMarchandiseStr.c_str());
            nbCapitaine = atoi(nbCapitaineStr.c_str());
            nbSecond = atoi(nbSecondStr.c_str());
            nbMatelot = atoi(nbMatelotStr.c_str());

            (*it)->setNom(nom);
            (*it)->setTonnage(tonnage);
            (*it)->setCapVoyageur(capVoyageur);
            (*it)->setCapMarchandise(capMarchandise);
            (*it)->setNbCapitaine(nbCapitaine);
            (*it)->setNbSecond(nbSecond);
            (*it)->setNbMatelot(nbMatelot);
        }
    }
    if(!estListe)
    {
        cout<<"  #  Numero inconnu ! "<<endl;
    }
}
void SupprimerNavire()
{
    int num;
    bool estListe = false;
    list<Navire*> listAlt ;

    system("cls");
    cout<<"  ###########################################################################"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ##                  Bienvenue dans le logiciel de gestion                ##"<<endl;
    cout<<"  ##                      de le compagnie maritime AM.LB                   ##"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ###########################################################################"<<endl;
    cout<<"  #                                                                         #"<<endl;
    cout<<"  #                 SUPPRESSION D'UN NAVIRE                                 #"<<endl;
    cout<<"  #                                                                         #"<<endl;

    list<Navire*>::iterator it;
    for(it = listNavires.begin();it != listNavires.end();it++)
    {
        cout<<"  #  "<<(*it)->getId()<<" : "<<(*it)->getNom()<<endl;
    }
    cout<<"  #    Entrez le numero du navire a supprimer : ";cin>>num;
    for(it = listNavires.begin();it != listNavires.end();it++)
    {
        if((*it)->getId() == num)
        {
            estListe = true;
        }
        else
        {
            listAlt.push_back(*it);
        }
    }
    cout<<"3";
    if(!estListe)
    {
        cout<<"  #  Numero inconnu ! "<<endl;
    }
    else
    {
        listNavires.erase(listNavires.begin(),listNavires.end());
        listNavires = listAlt ;
    }
}

void AfficherNavires()
{
    system("cls");
    cout<<"  ###########################################################################"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ##                  Bienvenue dans le logiciel de gestion                ##"<<endl;
    cout<<"  ##                      de le compagnie maritime AM.LB                   ##"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ###########################################################################"<<endl;
    cout<<"  #                                                                         #"<<endl;
    cout<<"  #                 AFFICHAGE DES NAVIRES                                   #"<<endl;
    cout<<"  #                                                                         #"<<endl;
    cout<<"  #    ID | NOM | TONNAGE | CAPVOY | CAPMARCH | NBSEC | NBMAT               #"<<endl;
    list<Navire*>::iterator it;
    for(it = listNavires.begin();it != listNavires.end();it++)
    {
        cout<<"  #  "<<(*it)->getId()<<" : "<<(*it)->getNom()<<" | "<<(*it)->getTonnage()<<" | ";
        cout<<(*it)->getCapVoyageur()<<" | "<<(*it)->getCapMarchandise()<<" | ";
        cout<<(*it)->getNbSecond()<<" | "<<(*it)->getNbMatelot()<<endl;
    }
    system("PAUSE");

}
